package dp;

import java.util.List;
import md.CuentaMD;

/**
 * La clase CuentaMD maneja los datos de la tabla cuenta de la BDD
 *
 * @author Jose Luis Torres
 * @version 1.0
 */
public class CuentaDP {

    private int idCuenta;
    private int codigoUsuario;
    private String nombreCuenta;
    private int idSistema;
    private int idContrasena;
    private CuentaMD cuentaMd;

    /**
     * Constructor vacio. Settea los atributos a los valores por defecto
     */
    public CuentaDP() {
        this.idCuenta = -1;
        this.codigoUsuario = -1;
        this.nombreCuenta = "";
        this.idSistema = -1;
        this.idContrasena = -1;
        this.cuentaMd = new CuentaMD();
    }

    /**
     * Metodo que decide si actualizar o ingresar un registro.
     *
     * @return Devuelve TRUE si es que se guarda correctamente el registro en la
     * BDD.
     */
    public boolean guardar() {
        boolean retorno = false;
        if (this.codigoUsuario != -1 && !this.nombreCuenta.equals("")) {
            setDatosMd();
            if (!this.cuentaMd.getDatosCuenta()) {
                retorno = ingresarCuenta();
            } else {
                this.setIdContrasena(this.cuentaMd.getIdContrasena());
                System.out.print(this.idContrasena);
                retorno = modificarCuenta();
            }
        }
        return retorno;
    }

    /**
     * Metodo para ingresar una nueva cuenta en el sistema.
     *
     * @return Devuelve TRUE si es que se ingresa correctamente el registro en
     * la BDD.
     */
    private boolean ingresarCuenta() {
        return this.cuentaMd.ingresarCuenta();
    }

    /**
     * Metodo para actualizar una cuenta existente en el sistema.
     *
     * @return Devuelve TRUE si es que se actualiza correctamente el registro en
     * la BDD.
     */
    private boolean modificarCuenta() {
        return this.cuentaMd.modificarCuenta();
    }

    /**
     * Metodo para eliminar una cuenta existente en el sistema.
     *
     * @return Devuelve TRUE si es que se elimina correctamente el registro en
     * la BDD.
     */
    public int eliminarCuenta() {
        setDatosMd();
        this.cuentaMd.eliminarCuenta();
        this.setIdContrasena(this.cuentaMd.getIdContrasena());
        return this.idContrasena;
    }

    /**
     * Muestra las TODAS cuentas disponible del usuario.
     *
     * @return Duevuelve una lista con TODAS las cuentas disponibles par el
     * usuario
     */
    public List getListCuentas() {
        return this.cuentaMd.verCuenta(this.codigoUsuario);
    }

    /**
     * Verifica que no exista la combinacion de cuenta y sistema en la BDD.
     *
     * @return Devuelve TRUE si es que existe la combinacion.
     */
    public boolean verificarCuenta() {
        boolean retorno = false;
        if (this.idSistema != -1 && !this.nombreCuenta.equals("")) {
            setDatosMd();
            retorno = this.cuentaMd.verificarCuenta();
        }
        return retorno;
    }

    /**
     * Verifica si un sistema existe o no en la BBD.
     *
     * @return Devuelve TRUE si el sistema existe en la BDD.
     */
    public boolean verificarSistema() {
        boolean retorno = false;
        if (this.idSistema != -1) {
            setDatosMd();
            retorno = this.cuentaMd.verificarSistema();
        }
        return retorno;
    }

    /**
     * Setea los atributos del objeto con la info de la BDD, de acuerdo al
     * código que se setea externamente. Es decir busca por código de cuenta y
     * seta el resto de atributos.
     *
     * @return Devuelve TRUE si es que se encuentra el codigo en la BDD. FALSE
     * caso contrario.
     */
    public boolean getDatosCuenta() {
        boolean retorno = false;
        setDatosMd();
        if (this.cuentaMd.getDatosCuenta()) {
            retorno = true;
            this.codigoUsuario = this.cuentaMd.getCodigoUsuario();
            this.idSistema = this.cuentaMd.getIdSistema();
            this.idContrasena = this.cuentaMd.getIdContrasena();
        }
        return retorno;
    }

    /**
     * Setea los atributos de la clase MD de acuerdo a los atributos de la DP
     */
    public void setDatosMd() {
        this.cuentaMd.setIdCuenta(this.idCuenta);
        this.cuentaMd.setCodigoUsuario(this.codigoUsuario);
        this.cuentaMd.setNombreCuenta(this.nombreCuenta);
        this.cuentaMd.setIdSistema(this.idSistema);
        this.cuentaMd.setIdContrasena(this.idContrasena);
    }

    /**
     * *************************************
     * Getters & Setters
     **************************************
     */
    public int getCodigoUsuario() {
        return codigoUsuario;
    }

    public int getIdContrasena() {
        return idContrasena;
    }

    public int getIdCuenta() {
        return idCuenta;
    }

    public int getIdSistema() {
        return idSistema;
    }

    public String getNombreCuenta() {
        return nombreCuenta;
    }

    public CuentaMD getCuentaMd() {
        return cuentaMd;
    }

    public void setCodigoUsuario(int codigoUsuario) {
        this.codigoUsuario = codigoUsuario;
    }

    public void setIdContrasena(int idContrasena) {
        this.idContrasena = idContrasena;
    }

    public void setIdCuenta(int idCuenta) {
        this.idCuenta = idCuenta;
    }

    public void setIdSistema(int idSistema) {
        this.idSistema = idSistema;
    }

    public void setNombreCuenta(String nombreCuenta) {
        this.nombreCuenta = nombreCuenta;
    }

    public void setCuentaMd(CuentaMD cuentaMd) {
        this.cuentaMd = cuentaMd;
    }
}
